package com.spring.helper;

import com.spring.annotation.Autowired;

import java.lang.reflect.Field;
import java.util.Map;
import java.util.Set;

/**
 * 遍历bean容器，将带有@Autowired注解的属性从bean容器中获取到对应的实例，并注入进去
 * 因此，自动装配的属性必须也是一个bean，即带有@Controller注解的类
 */
public class IocHelper {

    static{
        Map<Class<?>, Object> beanMap = BeanHelper.BeanMap;
        Set<Class<?>> classes = beanMap.keySet();
        for (Class<?> aClass : classes) {
            //获取当前类的实例
            Object classObj = beanMap.get(aClass);

            //暴力反射获取属性
            Field[] fields = aClass.getDeclaredFields();

            for (Field field : fields) {
                //查看属性是否需要自动注入
                if (field.isAnnotationPresent(Autowired.class)) {
                    //获取属性的类名
                    Class<?> fieldType = field.getType();

                    //从bean容器中获取属性对应的实例
                    Object fieldObj = beanMap.get(fieldType);

                    //设置属性的值
                    setFile(classObj, field, fieldObj);


                }

            }

        }

    }

    /**
     * 将classObj对象的field属性设为obj
     * @param classObj
     * @param field
     * @param obj
     */
    private static void setFile(Object classObj, Field field, Object obj) {
        //去除私有化
        field.setAccessible(true);
        try {
            //设置属性值
            field.set(classObj, obj);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

}
